#!/bin/bash

# SSL证书管理系统 - 统一部署启动脚本
# 默认为脚本部署模式，加 docker 参数为Docker部署模式
# 脚本目录使用 -scripts 后缀，部署目录由脚本处理

# 注意：使用了 set -e，但在主函数中禁用了它
# 原因：read 命令可能返回非零值，sudo ./install.sh 可能失败
# 在主函数中使用 set +e 并手动处理错误更安全
set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARN]${NC} $1"; }

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"

# 全局变量：强制仓库选择
FORCE_REPO=""

# 显示脚本部署模式的依赖要求
show_script_requirements() {
    echo
    echo "==============================================="
    echo "           脚本部署模式 - 服务依赖"
    echo "==============================================="
    echo
    echo "📋 需要预装的服务："
    echo
    echo "1. 🌐  Nginx"
    echo "   • 版本: 1.18+"
    echo
    echo "2. 🐘  PHP 8.3"
    echo "   • 版本: PHP 8.3.x"
    echo "   • 服务: php8.3-fpm"
    echo
    echo "3. 🗄️  MySQL"
    echo "   • 版本: MySQL 5.7+ 或 MariaDB 10.3+"
    echo
    echo "4. 🔄  Redis"
    echo "   • 版本: Redis 6.0+"
    echo
}

# 显示Docker部署模式的端口要求
show_docker_requirements() {
    echo
    echo "==============================================="
    echo "          Docker部署模式 - 端口占用"
    echo "==============================================="
    echo
    echo "🔌  将占用以下端口："
    echo
    echo "• 80   - HTTP服务 (cert-nginx)"
    echo "• 443  - HTTPS服务 (cert-nginx, 可选)"
    echo
    echo "💡  系统要求："
    echo "• Docker Engine 20.10+"
    echo "• Docker Compose 2.0+"
    echo "• 可用磁盘空间: 2GB+"
    echo
}

# 获取时间戳
get_timestamp() {
    date '+%Y%m%d_%H%M%S'
}

# 检测 Git
check_git() {
    log_info "检查Git安装状态..."
    
    # 检查git命令是否存在
    if ! command -v git >/dev/null 2>&1; then
        log_error "未检测到Git"
        echo
        log_info "请根据您的系统手动安装Git："
        echo
        log_info "  Ubuntu/Debian:"
        log_info "    sudo apt-get update && sudo apt-get install -y git"
        echo
        log_info "  CentOS/RHEL/Rocky/AlmaLinux:"
        log_info "    sudo yum install -y git"
        log_info "    # 或者安装更新版本"
        log_info "    sudo yum install -y git236  # IUS仓库"
        echo
        log_info "  Fedora:"
        log_info "    sudo dnf install -y git"
        echo
        log_info "  openSUSE:"
        log_info "    sudo zypper install -y git"
        echo
        log_info "  Arch Linux:"
        log_info "    sudo pacman -S --noconfirm git"
        echo
        exit 1
    fi
    
    # 检查Git版本
    local git_version=$(git --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
    log_info "当前Git版本: $git_version"
    
    # 检查版本是否满足最低要求 (1.7.1+)
    local required_version="1.7.1"
    if [ "$(printf '%s\n' "$required_version" "$git_version" | sort -V | head -n1)" != "$required_version" ]; then
        log_warning "Git版本较低: $git_version (建议 >= 1.7.1)"
        
        # 对于非常老的版本，测试是否能实际工作
        log_info "测试Git克隆功能..."
        local git_test_ok=false
        
        # 先尝试 Gitee
        if git ls-remote https://gitee.com/zhuxbo/cmd-deploy-product.git HEAD >/dev/null 2>&1; then
            git_test_ok=true
            log_success "Git可以访问 Gitee 仓库"
        else
            # 尝试 GitHub
            if git ls-remote https://github.com/zhuxbo/cmd-deploy-product.git HEAD >/dev/null 2>&1; then
                git_test_ok=true
                log_success "Git可以访问 GitHub 仓库"
            fi
        fi
        
        if [ "$git_test_ok" = false ]; then
            log_error "Git版本过低或网络问题，无法访问远程仓库"
            log_info "请升级Git或检查网络连接"
            exit 1
        fi
    else
        log_success "Git版本检查通过: $git_version"
    fi
}

# 检测并准备脚本目录
prepare_script_directory() {
    local mode="$1"
    local script_dir_name=""
    local script_path=""
    local git_url=""
    
    if [ "$mode" = "docker" ]; then
        script_dir_name="docker-deploy-scripts"
        script_path="$SCRIPT_DIR/$script_dir_name"
        git_url_gitee="https://gitee.com/zhuxbo/docker-deploy-product.git"
        git_url_github="https://github.com/zhuxbo/docker-deploy-product.git"
    else
        script_dir_name="cmd-deploy-scripts"
        script_path="$SCRIPT_DIR/$script_dir_name"
        git_url_gitee="https://gitee.com/zhuxbo/cmd-deploy-product.git"
        git_url_github="https://github.com/zhuxbo/cmd-deploy-product.git"
    fi
    
    # 如果脚本目录存在，先备份
    if [ -d "$script_path" ]; then
        local timestamp=$(get_timestamp)
        local backup_name="${script_dir_name}_backup_${timestamp}"
        
        log_warning "检测到已存在的脚本目录: $script_dir_name" >&2
        log_info "正在备份为: $backup_name" >&2
        mkdir -p "$SCRIPT_DIR/backup/deploy"
        mv "$script_path" "$SCRIPT_DIR/backup/deploy/$backup_name"
        if [ $? -eq 0 ]; then
            log_success "目录备份成功" >&2
        else
            log_error "目录备份失败" >&2
            return 1
        fi
    fi
    
    # 克隆最新脚本
    log_info "正在拉取最新${mode}部署脚本..." >&2
    
    local clone_success=false
    
    if [ -n "$FORCE_REPO" ]; then
        # 如果指定了强制仓库，只尝试指定的仓库
        if [ "$FORCE_REPO" = "gitee" ]; then
            log_info "从 Gitee 克隆..." >&2
            if git clone "$git_url_gitee" "$script_path" >/dev/null 2>&1; then
                clone_success=true
                log_success "从 Gitee 拉取成功" >&2
            else
                log_error "无法从 Gitee 克隆部署脚本" >&2
                return 1
            fi
        elif [ "$FORCE_REPO" = "github" ]; then
            log_info "从 GitHub 克隆..." >&2
            if git clone "$git_url_github" "$script_path" >/dev/null 2>&1; then
                clone_success=true
                log_success "从 GitHub 拉取成功" >&2
            else
                log_error "无法从 GitHub 克隆部署脚本" >&2
                return 1
            fi
        fi
    else
        # 未指定强制仓库，按原逻辑尝试
        # 先尝试 Gitee
        log_info "尝试从 Gitee 克隆..." >&2
        if git clone "$git_url_gitee" "$script_path" >/dev/null 2>&1; then
            clone_success=true
            log_success "从 Gitee 拉取成功" >&2
        else
            log_warning "Gitee 拉取失败，尝试 GitHub..." >&2
            
            # 尝试 GitHub 备用仓库
            if git clone "$git_url_github" "$script_path" >/dev/null 2>&1; then
                clone_success=true
                log_success "从 GitHub 拉取成功" >&2
            fi
        fi
    fi
    
    if [ "$clone_success" = true ]; then
        echo "$script_path"
        return 0
    else
        log_error "无法从任何仓库拉取部署脚本" >&2
        log_info "尝试的仓库:" >&2
        log_info "  - Gitee: $git_url_gitee" >&2
        log_info "  - GitHub: $git_url_github" >&2
        return 1
    fi
}

# 显示帮助信息
show_help() {
    echo
    echo "SSL证书管理系统 - 统一部署启动脚本"
    echo
    echo "用法:"
    echo "  $SCRIPT_NAME [选项] [模式]"
    echo
    echo "模式:"
    echo "  script          启动脚本部署模式（默认）"
    echo "  docker          启动Docker部署模式"
    echo
    echo "选项:"
    echo "  gitee            强制从 Gitee 仓库拉取"
    echo "  github           强制从 GitHub 仓库拉取"
    echo "  -h, help         显示此帮助信息"
    echo
    echo "示例:"
    echo "  ./deploy.sh                    # 脚本部署（自动选择仓库）"
    echo "  ./deploy.sh gitee              # 脚本部署（从 Gitee）"
    echo "  ./deploy.sh github docker      # Docker部署（从 GitHub）"
    echo "  ./deploy.sh docker gitee       # Docker部署（从 Gitee）"
    echo
    echo "目录结构:"
    echo "• cmd-deploy-scripts/    - 脚本部署的脚本目录"
    echo "• docker-deploy-scripts/ - Docker部署的脚本目录"
    echo "• ./                     - 脚本部署代码放在运行目录"
    echo "• docker-deploy/         - Docker部署的部署目录（由脚本创建）"
    echo
}

# 主函数
main() {
    # 在主函数中暂时禁用 set -e 以更好地处理错误
    set +e
    
    local mode="script"  # 默认模式
    local install_args=""  # 传递给 install.sh 的参数
    
    # 解析参数
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|help)
                show_help
                exit 0
                ;;
            gitee)
                FORCE_REPO="gitee"
                install_args="$install_args gitee"
                log_info "强制使用 Gitee 仓库"
                shift
                ;;
            github)
                FORCE_REPO="github"
                install_args="$install_args github"
                log_info "强制使用 GitHub 仓库"
                shift
                ;;
            docker|script)
                mode="$1"
                shift
                ;;
            *)
                log_error "无效的参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    echo
    echo "==============================================="
    echo "           SSL证书管理系统部署"
    echo "==============================================="
    
    # 显示选择的模式
    if [ "$mode" = "docker" ]; then
        log_info "部署模式: Docker容器化部署"
    else
        log_info "部署模式: 脚本直接部署"
    fi
    
    # 检测Git
    check_git
    
    # 准备脚本目录
    local script_dir
    script_dir=$(prepare_script_directory "$mode") || {
        log_error "脚本准备失败"
        exit 1
    }
    
    log_success "脚本目录准备就绪: $(basename "$script_dir")"
    
    # 显示依赖要求
    if [ "$mode" = "docker" ]; then
        show_docker_requirements
    else
        show_script_requirements
    fi
    
    # 询问是否执行安装（确保从终端读取）
    echo "是否立即执行安装脚本? (y/N): "
    read -r confirm < /dev/tty || confirm="n"  # 从终端读取，如果失败默认为 n
    
    if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
        log_info "开始执行安装脚本..."
        echo
        
        # 检查脚本目录是否存在
        if [ ! -d "$script_dir" ]; then
            log_error "脚本目录不存在: $script_dir"
            exit 1
        fi
        
        # 进入脚本目录
        cd "$script_dir" || {
            log_error "无法进入脚本目录: $script_dir"
            exit 1
        }
        
        # 检查并执行 install.sh
        if [ -f "./install.sh" ]; then
            # 确保脚本有执行权限
            chmod +x ./install.sh 2>/dev/null || true
            
            log_info "正在执行安装脚本..."
            # 传递仓库选择参数给 install.sh
            sudo ./install.sh $install_args
            
            # 捕获安装脚本的退出状态
            local install_status=$?
            if [ $install_status -eq 0 ]; then
                log_success "安装脚本执行完成"
            else
                log_error "安装脚本执行失败，退出码: $install_status"
                exit $install_status
            fi
        else
            log_error "未找到安装脚本: $script_dir/install.sh"
            log_info "脚本目录内容:"
            ls -la "$script_dir" >&2
            exit 1
        fi
    else
        log_info "取消安装"
        echo
        log_info "您可以稍后手动执行:"
        echo "  cd $script_dir"
        if [ -n "$install_args" ]; then
            echo "  sudo ./install.sh $install_args"
        else
            echo "  sudo ./install.sh"
        fi
        echo
    fi
}

# 运行主函数
main "$@"